home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / shadow.doc < prev    next >
Internet Message Format  |  1995-03-31  |  11KB

  1. From: bson@rice-chex.ai.mit.edu (Jan Brittenson) 
  2. Newsgroups: comp.sys.hp48 
  3. Subject: Shadowing Memory 
  4. Date: 9 Sep 91 08:24:38 GMT 
  5.  
  6. Here are two small utilities, that let you map around your cards. 
  7.  
  8. [Note: Both SHADOW and ZEROMAP are contained in the SHADOW directory 
  9.  on this disk.  -jkh-] 
  10.  
  11.    SHADOW maps a card to shadow another device. The contents of the 
  12. device are first copied to the card so you can modify them. Of course, 
  13. if your card is ROM (or write-protected RAM), then the copy is ignored 
  14. and the contents of the card will effectively overlay those of the 
  15. second device. It takes two arguments: the address of your card and 
  16. the destination address. 
  17.  
  18.  
  19.     SHADOW        Copy and map card to shadow another device 
  20.  
  21.         #card_address #destination_address  --> 
  22.  
  23.  
  24.  
  25.    ZEROMAP is similar to SHADOW, except the contents of the card are 
  26. cleared instead of copied. 
  27.  
  28.  
  29. Some examples: 
  30.  
  31.     #80000 #10000 SHADOW 
  32.  
  33.     Shadow parts of the system ROM (#10000-#1ffff) with a copy 
  34.     in the card in port 1. This would allow full MLDB 
  35.     breakpointing in the area 10000-1ffff. It could also be 
  36.     used from a program that subsequently modifies the "ROM." 
  37.  
  38.  
  39.     #10000 #80000 ZEROMAP 
  40.  
  41.     Restore from previous example. If we didn't clear the card 
  42.     we would lose parts of it, and the next time we yanked it 
  43.     and plugged it back in, we would get an "Invalid card data" 
  44.     error. This has to do with the sort of trickery SHADOW 
  45.     resorts to in order to avoid "Invalid card data" errors. 
  46.  
  47.      
  48.     #C0000 #C0000 ZEROMAP 
  49.  
  50.     Clear card in port 2. 
  51.  
  52.  
  53. About ports and such: 
  54.  
  55.    A single plug-in card will always be in port 1, even if plugged 
  56. into connector 2. Port 1 is at #80000 and port 2 at #C0000. There is 
  57. also a third config table entry which I'm not sure what it's used for, 
  58. maybe a debug ROM. The default address for the third "port" is #D0000. 
  59. The system ROM is in the region #00000-#6FFFF.  
  60.  
  61.    Notice that I will not be responsible for any data or other forms 
  62. of lossage. If properly used, you should be able to work miracles. 
  63. Improperly used, you better have you backups readily available! Also, 
  64. using these routines assumes a certain knowledge of HP-48SX internals. 
  65. Do not attempt to store data on a card remapped by means of the 
  66. routines included here: that is almost guaranteed lossage. 
  67.  
  68. The only argument checking performed is simple type checking. 
  69.  
  70. Have fun, 
  71.                         -- Jan Brittenson 
  72.                            bson@ai.mit.edu 
  73.  
  74.  
  75.  O  / 
  76.   \/ 
  77.   /\  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  78.  O  \ 
  79.  
  80.  
  81. ; shadow.star - shadow device with port 
  82. ; Jan Brittenson, September 1991 
  83. ; This program is in the public domain. 
  84. ; Assemble with (in order) hp48.star and stdsyms.star 
  85.  
  86.     radix    0x10 
  87.     header 
  88.  
  89. ; SHADOW 
  90. ; In: 
  91. ;    2: old address (short) 
  92. ;    1: new address (short) 
  93.  
  94. conf_tbl = 70428            ; System configuration table 
  95.  
  96.  
  97.     rpl 
  98.       Prg 
  99.         Need_2_args 
  100.         Switch_on_argtype 
  101.         _Short 0xbb            ; Two binary integers 
  102.         Prg 
  103.            Two_bins_to_shorts    ; Convert addresses to shorts 
  104.     endrpl 
  105.  
  106.  
  107.     code 
  108.  
  109. ; Pop address, find fake pointer (all pages have one) 
  110.  
  111.     call    getshort        ; A.A = shadow address 
  112.     move    a, r2 
  113.     call    getshort        ; A.A = RAM address 
  114.     swap    a, r2            ; R2.A = RAM address 
  115.  
  116.     call    save_regs        ; Save system RPL registers 
  117.  
  118.     move    3, p     
  119.     clr.wp    a            ; Clear low 4 nybbles of address 
  120.     clr    p 
  121.  
  122.     move    a, r0            ; R0.A = shadow location 
  123.     move    a, d0 
  124.     dec    d0 
  125. $1: 
  126.     inc    d0 
  127.     move.a    @d0, c 
  128.     brnz.a    c, $1 
  129.     swap    c, d0            ; C.A = fake config address 
  130.     move    c, r1            ; R1.A = fake config address 
  131.  
  132. ; Copy ROM and remap RAM 
  133.  
  134.     clrb    0xf, st            ; Disable interrupts 
  135.  
  136.     move    r2, c            ; C.A = RAM adress 
  137.     move    c, d1 
  138.     move.p5    10000, c        ; 32kB 
  139.     move    a, d0            ; D0 = shadow page address 
  140.     call    blkcopy            ; Copy 32kB from #10000->#80000 
  141.  
  142.     move    r2, c            ; C.A = RAM adress 
  143.     uncnfg                ; Unconfig RAM card 
  144.     move.p5    0xf0000, c        ; 32kB Mask 
  145.     config 
  146.     move    r0, c            ; New location 
  147.     config 
  148.  
  149. ; Update system config table 
  150.  
  151.     move    r1, c            ; Value to stick in config table 
  152.     move.5    conf_tbl+^d10, d0    ; D0 = & P1 config address 
  153.     move.a    c, @d0            ; Update config address 
  154.  
  155.     call    calc_conf_crc        ; Calculate config table CRC 
  156.                     ; D0 = & CRC, C.A = new CRC 
  157.     move.4    c, @d0            ; CRC = new CRC 
  158.  
  159. ; Finished 
  160.  
  161.     setb    0xf, st            ; Enable interrupts 
  162.     brbc    0xe, st, $100        ; No interrupts occured 
  163.     rsi                ; Service pending interrupts 
  164. $100: 
  165.     jump    rr_rplcont        ; Restore RPL registers and continue 
  166.  
  167.     even 
  168.     endcode 
  169.  
  170.     rpl 
  171.       EndObj 
  172.     EndObj 
  173.     endrpl 
  174.  
  175.  
  176.  O  / 
  177.   \/ 
  178.   /\  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  179.  O  \ 
  180.  
  181. ; zeromap.star - remap and clear port 
  182. ; Jan Brittenson, Septembet 1991 
  183. ; This program is in the public domain. 
  184. ; Assemble with (in order): hp48.star and stdssyms.star 
  185.  
  186.     radix    0x10 
  187.     header 
  188.  
  189. ; ZEROMAP 
  190. ; In: 
  191. ;    2: old address (short) 
  192. ;    1: new address (short) 
  193.  
  194. conf_tbl = 70428            ; System configuration table 
  195.  
  196.  
  197.     rpl 
  198.       Prg 
  199.         Need_2_args 
  200.         Switch_on_argtype 
  201.         _Short 0xbb            ; Two binary integers 
  202.         Prg 
  203.            Two_bins_to_shorts    ; Convert addresses to shorts 
  204.     endrpl 
  205.  
  206.  
  207.     code 
  208.  
  209. ; Pop address, find fake pointer (all pages have one) 
  210.  
  211.     call    getshort        ; A.A = shadow address 
  212.     move    a, r2 
  213.     call    getshort        ; A.A = RAM address 
  214.     swap    a, r2            ; R2.A = RAM address 
  215.  
  216.     call    save_regs        ; Save system RPL registers 
  217.  
  218.     move    3, p     
  219.     clr.wp    a            ; Clear low 4 nybbles of address 
  220.     clr    p 
  221.  
  222.     move    a, r0            ; R0.A = shadow location 
  223.  
  224. ; Clear remap RAM 
  225.  
  226.     clrb    0xf, st            ; Disable interrupts 
  227.  
  228.     move    r2, c            ; C.A = RAM adress 
  229.     move    c, d1            ; D0 = RAM address 
  230.     move.p5    10000, c        ; 32kB 
  231.     call    blkzero            ; Clear RAM 
  232.  
  233.     move    r2, c            ; C.A = RAM adress 
  234.     uncnfg                ; Unconfig RAM card 
  235.     move.p5    0xf0000, c        ; 32kB Mask 
  236.     config 
  237.     move    r0, c            ; New location 
  238.     config 
  239.  
  240. ; Update system config table 
  241.  
  242.     move.5    conf_tbl+^d10, d0    ; D0 = & P1 config address 
  243.     move.a    c, @d0            ; Update config address 
  244.  
  245.     call    calc_conf_crc        ; Calculate config table CRC 
  246.                     ; D0 = & CRC, C.A = new CRC 
  247.     move.4    c, @d0            ; CRC = new CRC 
  248.  
  249. ; Finished 
  250.  
  251.     setb    0xf, st            ; Enable interrupts 
  252.     brbc    0xe, st, $100        ; No interrupts occured 
  253.     rsi                ; Service pending interrupts 
  254. $100: 
  255.     jump    rr_rplcont        ; Restore RPL registers and continue 
  256.  
  257.     even 
  258.     endcode 
  259.  
  260.     rpl 
  261.       EndObj 
  262.     EndObj 
  263.     endrpl 
  264.  
  265.  
  266.  O  / 
  267.   \/ 
  268.   /\  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  269.  O  \ 
  270.  
  271. ;; stdsyms.star - some common symbols 
  272.  
  273.     nlistblock 
  274.  
  275.     radix    0x10 
  276.  
  277. Not_bool = 3af2 
  278. Doerr_string = 15048 
  279. Text = 1314d 
  280. Toggle_text = 132c5 
  281. Cmd_DOERR = 1a339 
  282. Cmd_EVAL = 1a3be 
  283. Cmd_PATH = 1a125 
  284. Cmd_HOME = 1a140 
  285. Home = 8d92 
  286. Path = 1848c 
  287. Purge_global = 1854f 
  288. Sto_any_global = 18513 
  289. Rcl_global = 797b 
  290. Cmd_STO = 20ccd 
  291. GROB_null = 505b2 
  292. OpenIO = 2eb37 
  293. CloseIO = 315c6 
  294. Freeze = 142fb 
  295. Cllcd = 5046a 
  296. Eval = 18eba 
  297. Eval_prev_context = 6fd1 
  298. Push_next = 6e97 
  299. Char_000 = 6541e 
  300. Add_string_char = 52ee 
  301. Add5 = 6258a 
  302. Inc = 3def 
  303. Dup_Inc = 628eb 
  304. Short_200h = 64f0e 
  305. Short_100h = 64e32 
  306. Short_60h = 64c8e 
  307. Short_c0h = 64dd8 
  308. Short_bbh = 64dce 
  309. Short_31h = 64b44 
  310. String_to_grob_pitch8 = 11d00 
  311. Turn_menu_off = 4e2cf 
  312. Nullstring = 55df 
  313. Nullstring_copy = 1613f 
  314. Program_null = 40788 
  315. Realloc = 61c1c 
  316. Copy = 6657 
  317. Num = 1410f 
  318. Add = 3dbc 
  319. Add_string_string = 5193 
  320. LeftLess1_string_short = 63259 
  321. ArrayTo_array = 1d0ab 
  322. ArrayTo = 1d0ab 
  323. Dec = 3e0e 
  324. Dup = 3188 
  325. EndObj = 312b 
  326. Equalp = 3d19 
  327. Nonzerop = 3cc7 
  328. No_args = 18a15 
  329. Zerop = 3ca6 
  330. Dup_Zerop = 62266 
  331. Get_2Lastlocal = 613e7 
  332. Get_3lastlocal = 6140e 
  333. Get_4lastlocal = 61438 
  334. Get_lastlocal = 613b6 
  335. If_then_else = 61ad8 
  336. If_true_then = 619bc 
  337. Dup_If_zero_then_exec = 618a8 
  338. If_User_flag_then_else = 63ed9 
  339. Pview_short_short = 4f052 
  340. Listob = 2a74 
  341. ListAlgPrgTo = 54af 
  342. ListTo = 54af 
  343. ListTo_StoreLocals = 74d0 
  344. Local_M = 0xe4c1 
  345. Local_N = 0xe4ae 
  346. Local_S = 41bea 
  347. Mul = 3ec2 
  348. Mul2 = 3e6f 
  349. Mul_array_real = 362dc 
  350. Next = 7334 
  351. Prg = 2d9d 
  352. True = 3a81 
  353. False = 3ac0 
  354. Bin_to_short = 5a03 
  355. Two_Bins_to_shorts = 4f3d1 
  356. Real_to_short = 18cea 
  357. Real_to_short_Swap = 62e7b 
  358. Swap_Over = 61380 
  359. Roll = 3325 
  360. Drop = 3244 
  361. Swap_Drop = 60f9b 
  362. Drop2 = 3258 
  363. Drop4 = 60f7e 
  364. Xlib_to_Rpl = 7e99 
  365. Error_Bad_arg_type = 18cb2 
  366. Error_Undef_Name = 18c92 
  367. Short_0bh = 405d 
  368. Clear_lastargs = 4d33 
  369. Reset_lastargs = 53842 
  370. Need_1_arg = 18ab2 
  371. Need_2_args = 18a8d 
  372. Need_4_args = 18b9f 
  373. SL_Need_1_arg = 18aa5 
  374. Switch_on_argtype = 18fb2 
  375. SL_Switch_2_argtypes = 18edf 
  376. SL_Switch_on_argtype = 18ece 
  377. SL_Switch_4_argtypes = 18f01 
  378. SaveLast_Need_1_arg = 18aa5 
  379. Lastkey = 4714 
  380. Short_0 = 3fef 
  381. Short_1 = 3ff9 
  382. Short_2 = 4003 
  383. Short_3 = 400d 
  384. Short_4 = 4017 
  385. Short_5 = 4021 
  386. Short_6 = 402b 
  387. Short_8 = 403f 
  388. Short_0dh = 4071 
  389. Short_0eh = 407b 
  390. Short_0fh = 4085 
  391. Short_10h = 408f 
  392. Short_16h = 40cb 
  393. Short_1fh = 4125 
  394. Short_20h = 412f 
  395. Short_21h = 4139 
  396. Short_40h = 64bda 
  397. Short_7fh = 1cd16 
  398. Short_83h = 64d24 
  399. Pdim = 4b323 
  400. Equal2p = 6229a 
  401. Real_1 = 2a2c9 
  402. Real_2 = 2a2de 
  403. Real_3 = 2a2f3 
  404. Real_4 = 2a308 
  405. Real_5 = 2a31d 
  406. Real_7 = 2a347 
  407. Short_to_real = 18dbf 
  408. Start_1_to_N = 73db 
  409. Store_2lastlocal = 615f0 
  410. Store_3lastlocal = 61600 
  411. Store_4lastlocal = 61610 
  412. Store_lastlocal = 615e0 
  413. Store_local = 61625 
  414. Swap = 3223 
  415. Array_dims = 35a9 
  416. ToArray_real = 1d02c 
  417. ToArray_list = 1d040 
  418. Size_list = 567b 
  419. ToList = 5459 
  420. ToList2 = 631b9 
  421. TwoShorts_to_reals = 1950b 
  422. TwoReals_to_shorts = 194f7 
  423. Short_to_bin = 59cc 
  424. Swap_Over = 61380 
  425. Over = 32c2 
  426. Rot = 3295 
  427. Rolld3 = 60fac 
  428. Rolld4 = 6109e 
  429. Div2 = 3e8e 
  430. Div = 3ef7 
  431. Disp_any_real = 140ab 
  432. Disp_pitch8Str_line0 = 1245b 
  433. Disp_pitch8Str_line1 = 1246b 
  434. Disp_pitch8str_line2 = 1247b 
  435. Disp_pitch8str_line3 = 1248b 
  436. Disp_pitch8str_line4 = 1249b 
  437. Disp_pitch8str_line5 = 124ab 
  438. Disp_pitch8str_line6 = 124bb 
  439. Disp_pitch8str_line7 = 124cb 
  440.  
  441. Attach_Home_short = 7709 
  442.  
  443. Loop = 71a2 
  444. Exit_loop = 71e5 
  445. Until = 71c8 
  446. Next = 7334 
  447. If_ATTN_then_FlushKbd_Kill = 4243e 
  448. If_ATTN_then_End = 4245c 
  449. Pr1 = 318fe 
  450. Error_bad_arg_value = 18ca2 
  451. If_not_equal_then_short = 6336c 
  452.  
  453. Get_StkGrob = 12655 
  454. Repl_Grob_short = 11679 
  455.  
  456.  
  457. ;; ML routines 
  458.  
  459. getshort = 6641 
  460. get2shorts = 3f5d 
  461. pushshort_r0r1 = 6529 
  462. pushshort_r0_rplret= 18d0a 
  463. pushobj_a = 54266 
  464. pushobj_a_rplret = 6ec9 
  465. strlen_a = 120cc 
  466. strlen_d1 = 120cf 
  467. stralloc_nibbles = 5b7d 
  468. blkcopy = 670c 
  469. blkzero = 675c 
  470. save_regs = 679b 
  471. restore_regs = 67d2 
  472. rplcont = 71be 
  473. rr_rplcont = 5143 
  474. kbflush = 0xd57 
  475. indicate_not_busy = 42359 
  476. int_mask = 10e 
  477. uart_xmit = 116 
  478. adjust_parity = 3113d 
  479. uart_xmit_rdy_p = 310ca 
  480. recv_getc = 31289 
  481. calc_conf_crc = 9b73 
  482.  
  483. ATTN_p = 4988 
  484. clear_ATTN = 0xd8e 
  485.  
  486. start_of_stack = 7057e 
  487. keybuf = 704ea 
  488. graph_grob_ptr = 70565 
  489. stack_grob_ptr = 70556 
  490.  
  491. Copyright = ch^^d169 
  492. Beta = ch^^d223 
  493. CR = ch^015 
  494. LF = ch^012 
  495.  
  496.                         -- Jan Brittenson 
  497.                            bson@ai.mit.edu 
  498.